home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sprite 1984 - 1993
/
Sprite 1984 - 1993.iso
/
src
/
machserver
/
1.098
/
dev
/
sun4c.md
/
devEmulexTape.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-11
|
4KB
|
128 lines
/*
* devEmulexTape.c --
*
* Procedures that set up command blocks and process sense
* data for Emulex tape drives.
*
* Copyright 1986 Regents of the University of California
* All rights reserved.
* Permission to use, copy, modify, and distribute this
* software and its documentation for any purpose and without
* fee is hereby granted, provided that the above copyright
* notice appear in all copies. The University of California
* makes no representations about the suitability of this
* software for any purpose. It is provided "as is" without
* express or implied warranty.
*/
#ifndef lint
static char rcsid[] = "$Header: /sprite/src/kernel/dev/sun3.md/RCS/devEmulexTape.c,v 9.0 89/09/12 14:58:53 douglis Stable $ SPRITE (Berkeley)";
#endif not lint
#include "sprite.h"
#include "dev.h"
#include "devInt.h"
#include "scsi.h"
#include "scsiDevice.h"
#include "scsiHBA.h"
#include "scsiTape.h"
#include "emulexTape.h"
/*
* Sense data returned from the Emulex tape controller in the shoeboxes.
*/
#define EMULEX_SENSE_BYTES 11
typedef struct {
ScsiClass7Sense extSense; /* 8 Bytes */
unsigned char pad1 :1;
unsigned char error :7; /* Regular SCSI error code */
unsigned char highRetries; /* High byte of retry count */
unsigned char lowRetries; /* Low byte of retry count */
} EmulexTapeSense; /* Known to be 11 Bytes big */
/*
* Definitions for the mode select command. This is specific to the
* Emulex controller. The mode select command is used to change from
* QIC_24 format (one standard, not the one we use) to QIC_02 format
* (the more common, older, standard that we do use).
*/
typedef struct EmulexModeSelBlock {
unsigned char density; /* Density code */
unsigned char highCount; /* Count of blocks at this density */
unsigned char midCount; /* middle byte of above */
unsigned char lowCount; /* low byte */
unsigned char pad1; /* Reserved */
unsigned char highLength; /* Length of the blocks */
unsigned char midLength; /* middle byte of above */
unsigned char lowLength; /* low byte */
} EmulexModeSelBlock;
/*
* Density values for the mode select block.
*/
#define EMULEX_QIC_24 0x05
#define EMULEX_QIC_02 0x84
typedef struct EmulexModeSelParams {
ScsiTapeModeSelectHdr header;
EmulexModeSelBlock block;
unsigned char :5; /* Reserved */
unsigned char disableErase :1; /* disable erase ahead */
unsigned char autoLoadInhibit :1;
unsigned char softErrorCount :1;
} EmulexModeSelParams;
/*
*----------------------------------------------------------------------
*
* DevEmulexAttach --
*
* Verify and initialize the attached scsi device as a emulex tape..
*
* Results:
* SUCCESS if the device is a working emulex tape drive.
* DEV_NO_DEVICE if the device is not a emulex tape drive.
* A Sprite return status if the device is a broken emulex tape drive.
*
* Side effects:
* Sets the type and call-back procedures.
*
*----------------------------------------------------------------------
*/
/*ARGSUSED*/
ReturnStatus
DevEmulexAttach(devicePtr, devPtr, tapePtr)
Fs_Device *devicePtr; /* Fs_Device being attached. */
ScsiDevice *devPtr; /* SCSI device handle for drive. */
ScsiTape *tapePtr; /* Tape drive state to be filled in. */
{
unsigned char statusByte;
ScsiCmd senseCmd;
char senseData[SCSI_MAX_SENSE_LEN];
int length;
ReturnStatus status;
/*
* Since we don't know about the inquiry data (if any) returned by
* the Emulex tape, check using the size of the SENSE data returned.
*/
DevScsiSenseCmd(devPtr, SCSI_MAX_SENSE_LEN, senseData, &senseCmd);
status = DevScsiSendCmdSync(devPtr, &senseCmd, &statusByte, &length,
(int *) NIL, (char *) NIL);
if ( (status != SUCCESS) ||
(statusByte != 0) ||
((length != EMULEX_SENSE_BYTES) &&
(length != SCSI_MAX_SENSE_LEN) &&
(length != 14)) ){
return DEV_NO_DEVICE;
}
/*
* Take all the defaults for the tapePtr.
*/
tapePtr->name = "Emulex Tape";
return SUCCESS;
}